home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
CDC
/
CDCSXSRC.LZH
/
SKELTON.HAS
< prev
next >
Wrap
Text File
|
1995-03-20
|
27KB
|
1,216 lines
*======================================================*
*
*
* SX-WINDOW スケルトン イベントループ部
* 1995.03.20
* You Utzse@電脳魔術団@Mankaiseisakujo /1993-1995
*
*
*======================================================*
.include DOSCALL.MAC *標準の奴(XC)
.include SXCALL.MAC
.include SXCALL.H
.include YOU200.MAC *独自のマクロ定義ファイルです
.include HASMACRO.MAC *HAS2.5以降のマクロパッケージ
.include WORK.INC *ワークエリアの内容を定義するファイル
.include FLAG.INC *条件付アセンブル処理を定義するファイル
.if USE_MSXLIB=1
.include MSXLIB.MAC *MSXLIBをアセンブラから利用する場合
*のヘッダファイル…
.endif
.xref InitGraph
*==============================================*
* MODULE_HEAD_AREA
*----------------------------------------------*
.text
dc.b '$id EV_LOOP Skelton by You Utzse rel.2.0.0$'
.even
MDHEAD: *[ モジュールヘッダ ]
dc.l OBJECT+MDTYPE *モジュールタイプ
dc.l 0 *プログラムエリアサイズ (Xファイルの場合意味がない)
dc.l SXSTART-MDHEAD *SX-SHELLからのスタートアドレスオフセット
dc.l WORKSIZE+STKSIZE *ワークエリアのサイズ
dc.l COMMONSIZE *コモンエリアのサイズ
dc.l 0,0,0 *システム予約
*==============================================*
* DOS_EXEC_ENTRY
*----------------------------------------------*
DOSSTART:: *コマンドラインから起動した場合
*ここからスタートする
lea 64(a1),a1
move.l a1,sp
lea 16(a0),a0
sub.l a0,a1
move.l a1,-(sp)
pea (a0)
DOS _SETBLOCK *専有メモリを縮小する
clr.l -(sp)
pea shcomm(pc)
pea shname(pc)
move.w #2,-(sp)
DOS _EXEC *デバッグ用カーネルのパスをサーチする
clr.l -(sp)
pea shcomm(pc)
pea shname(pc)
clr.w -(sp)
DOS _EXEC *デバッグ用カーネルを起動する
tst.l d0 *正常に終了した場合
bpl p_execi1 *そのまま終了
pea mes_execerr(pc) *エラーメッセージを
DOS _PRINT *表示する
p_execi1:
DOS _EXIT *終了
.data
mes_execerr:
dc.b 'カーネルの起動に失敗しました!!!',13,10,0
.even
shname:
dc.b 'A:\SHELL\SXWDB.X -D -K -R7 -L1',0 *カーネルのオプション
.even
.bss
shcomm:
ds.b 258
*==============================================*
* SX_SHELL_ENTRY
*----------------------------------------------*
.text
.even
SXSTART:: *SX-SHELLから起動した場合ここからスタートする
movea.l a1,a5 *ワークエリア先頭アドレス
move.l a2,cmdLine(a5) *コマンドラインアドレス
move.l a3,envPtr(a5) *環境アドレス
moveq.l #0,d0
move.l d0,-(sp)
move.w #1,-(sp) *文字列テーブルを再配置不能ブロックに
move.l d0,-(sp) *つくるモード
pea.l winRect(a5)
pea.l (a2) *コマンドラインアドレス
SX __TSTakeParam,18
tst.l d0
bmi EXIT2
move.w d0,paramFlg(a5) *オプションを得る
move.l a0,argTbl(a5) *文字列テーブルのアドレス
.ifdef ~VERSION
jbsr CHKVER *[バージョンチェック]
bmi EXIT2 *終了処理なしの終了ルーチン
.endif
jbsr InitWork *[ワーククリア]
jbsr InitInfo *[パス名関連の初期化]
.iff OPTION_SW=0
.xref SWITCHproc
move.l argTbl(a5),-(sp) *文字列テーブルの先頭アドレス
move.w #SW_CHK,-(sp)
SXSUB SWITCHproc,6
bmi EXIT2
.endif
.xref Initproc
jbsr Initproc
bmi EXIT2
.if WINCOUNT>=1
.if EXTENDED_WIN=1
xref InitWin
.endif
jbsr InitWin *[ウィンドウの初期化]
bmi EXIT
.endif
.if WINCOUNT>=1
.xref CtrlInitproc
jbsr CtrlInitproc *コントロール初期化(外部で用意)
bmi EXIT
.endif
move.w #USR_EV_MASK,eventMask(a5)
*==============================================*
* MAIN_LOOP
*----------------------------------------------*
MAIN_LOOP::
pea eventRec(a5)
move.w eventMask(a5),-(sp)
SX __TSEventAvail,6 *イベント取得
moveq.l #%1111,d0
and.w eventRec_what(a5),d0 *コードが返る
add.w d0,d0
move.l d0,S_event(a5) *「サブ」のウィンドウが参照するワーク
move.w eventTable(pc,d0.w),d0 *イベントコードによって
jsr eventTable(pc,d0.w) *分岐する
blt EXIT *終了ならmove.l #-1,d0してもどる
.iff WINCOUNT<=1
.xref SUB_LOOP
jbsr SUB_LOOP *他にウィンドウを開くなら飛ぶ
blt EXIT *終了ならmove.l #-1,d0してもどる
.endif
bra MAIN_LOOP
*----------------------------------------------*
eventTable: *分岐テーブル
dc.w IDLE-eventTable *0 アイドルイベント
dc.w MSLDOWN-eventTable *1 レフトダウンイベント
dc.w MSLUP-eventTable *2 レフトアップイベント
dc.w MSRDOWN-eventTable *3 ライトダウンイベント
dc.w MSRUP-eventTable *4 ライトアップイベント
dc.w KEYDOWN-eventTable *5 キーダウンイベント
dc.w KEYUP-eventTable *6 キーアップイベント
dc.w UPDATE-eventTable *7 アップデートイベント
dc.w dammy-eventTable *8 --
dc.w ACTIVATE-eventTable *9 アクティベイトイベント
dc.w dammy-eventTable *10 --
dc.w dammy-eventTable *11 --
dc.w SYSTEM1-eventTable *12 システムイベント1
dc.w SYSTEM2-eventTable *13 システムイベント2
dc.w dammy-eventTable *14 システムイベント3
dc.w dammy-eventTable *15 システムイベント4
*==============================================*
*通常不要なイベント
*----------------------------------------------*
MSLUP::
MSRUP::
KEYUP::
dammy::
~T
rts *なにもしないで戻る
*==============================================*
IDLE::
.iff IDLE_MASK=0
.xref IDLEproc
SXSUB IDLEproc,0
.endif
rts
*==============================================*
* EVENT_ROUTINE
*==============================================*
*[レフトダウンイベント]
*左クリックの操作
*
*----------------------------------------------*
MSLDOWN::
.if WINCOUNT>=1
.xref MSLDproc
move.l eventRec_whom1(a5),d0 *左クリックが起きたウィンドウレコード
beq MSLD9 *NILなら
Xlea winPtr(a5),a1 *自分のウィンドウ上で発生したか?
cmp.l a1,d0
bne MSLD9 *違うならMSLD9へ
SETPORT3 winPtr(a5) *自分へのイベントなので問答無用でSETPORTする
SXSUB GetEvent,0 *自分へのイベントなのでイベントを取り除く
jbsr ChkMouse_DClick *ダブルクリックの判定
SXSUB MSLDproc,0 *(d0に戻り値いれること
*エラーチェックずみのこと)
cmp.w #W_INCLOSE,d0 *クローズボックス?
beq CloseBox *ならばお終い
MSLD9:
~T
rts
.endif
*==============================================*
*[ライトダウンイベント]
*----------------------------------------------*
MSRDOWN::
.if WINCOUNT>=1
.xref MSRDproc
move.l eventRec_whom1(a5),d0 *右クリック時のウィンドウレコード
beq MSRD9 *NILなら
Xlea winPtr(a5),a0 *自分のウィンドウレコード
cmp.l a0,d0 *同じウィンドウ上で発生したか
bne MSRD9
move.l eventRec_ShiftBit(a5),d0
ifne <tst.w winActive(a5)> *現在ウィンドウはアクティブか?
SETPORT3 winPtr(a5)
SXSUB ChkMousePtr,0 *現在のマウスのローカル座標を
*ワークにいれる
SXSUB MSRDproc,0
bmi MSRD_ERR
elseifne <andi.l #KS_OPT1,d0>
SETPORT3 winPtr(a5)
SXSUB ChkMousePtr,0
SXSUB MSRDproc,0
bmi MSRD_ERR
endif
.endif
MSRD9:
~T
rts
MSRD_ERR:
~F
rts
*==============================================*
*[キーダウンイベント]
*----------------------------------------------*
KEYDOWN::
.if WINCOUNT>=1
.xref KEYDproc
ifne <tst.w winActive(a5)> *現在ウィンドウはアクティブか?
ifeq <SCUT K_Q,KS_OPT1>
~F
rts *アクティブでOPT1+Qなら終了
endif
endif
.endif
SXSUB KEYDproc,0
~T
rts
*==============================================*
*[アップデートイベント]
*----------------------------------------------*
UPDATE::
.if WINCOUNT>=1
.xref UPDTproc
Xpea winPtr(a5)
SX __WMUpdate,4
SXSUB UPDTproc,0
Xpea winPtr(a5)
SX __WMUpdtOver,4
.endif
~T
rts
*==============================================*
*[ アクティベートイベント ]
*----------------------------------------------*
ACTIVATE::
.if WINCOUNT>=1
.xref ACTproc
move.l eventRec_whom1(a5),d0
beq ACT9 *NILなら
Xlea winPtr(a5),a0 *自分のウィンドウが
cmp.l a0,d0 *アクティブになった?
bne ACT0 *違うのならACT0へ
move.w #-1,winActive(a5) *アクティブフラグをセット
jbsr ACTproc
bra ACT9
ACT0:
move.w #0,winActive(a5) *アクティブフラグをリセット
jbsr ACTproc
.endif
ACT9:
~T
rts
*==============================================*
*[システムイベント]
*----------------------------------------------*
SYSTEM1::
SYSTEM2::
move.w eventRec_what2(a5),d0
cmp.w #ENDTSK,d0 *タスクの終了?
beq CloseBox *ならばおしまい
cmp.w #CLOSEALL,d0 *全ウィンドウのクローズ?
beq CloseBox *ならばおしまい
.iff OPTION_MODE=0
*.xref SWstr_create
move.l d0,-(sp) *他にセーブするものがある場合の保険
ifeq <cmp.w #SAVE,d0> *FLAG.INCでオプションあり設定なら
move.w #SW_SAVE,-(sp)
SXSUB SWITCHproc,2 *OPTIONセーブルーチンが組み込まれる
endif
move.l (sp)+,d0 *メインループには戻らない
.endif
.iff EXT_SYS_EV=0
.xref SYSproc
jbsr SYSproc *その他のイベントに対応するなら飛ぶ
rts *結果はd0に入れて返ること
.endif
~T
rts
*==============================================*
*ウィンドウをアクティブにする
*----------------------------------------------*
MainWindowSelect::
.if WINCOUNT>=1
Xpea winPtr(a5) *自分のウィンドウをアクティブに
SX __WMSelect,4
.endif
~T
rts
*==============================================*
*クローズボックス
*----------------------------------------------*
CloseBox::
~F
rts
*==============================================*
* EXIT
*==============================================*
EXIT:: *[終了する]
jbsr TINI *アプリケーションの終了処理
EXIT2: *[いきなり終了する]廃棄するものがなにもない
move.l d0,-(sp)
SX __TSExit,0
*==============================================*
TINI::
.if WINCOUNT>=1
.xref CtrlTiniproc
jbsr CtrlTiniproc
Xpea winPtr(a5) *メインウィンドウの廃棄
.if WINTYPE='H'
SX __WMClose,4
.else
.if WINTYPE='P'
SX __WMDispose,4
.endif
.endif
.xref TINIproc
SXSUB TINIproc,0 *メモリ廃棄など
.endif
rts
*==============================================*
*デフォルトのウィンドウ生成
*==============================================*
.if EXTENDED_WIN=0
.if WINCOUNT>=1
InitWin:
move.l winRect(a5),d0
move.w paramFlg(a5),d1
btst #0,d1 *'-W'オプションが指定された?
beq _POS0 *されなかったら_POS0へ
move.l winRect+4(a5),d1 *正しいレクタングルが指定されたか
beq _POS1 *X2,Y2が0
tst.w d1
cmp.w d0,d1
ble _POS1 *Y2がY1より小さいか同じ
swap d0
swap d1
cmp.w d0,d1
bgt _POS2 *まっとうな時
swap d0
swap d1
bra _POS1 *X2がX1より小さいか同じ
_POS0:
SX __TSGetWindowPos,0
move.l d0,winRect(a5) *デフォルト位置を得る
_POS1:
add.l #WIN_X*$10000+WIN_Y,d0 *ウィンドウレクタングルを作成
move.l d0,winRect+4(a5)
_POS2:
main_win_open:
move.l taskID(a5),-(sp) *タスクID
move.w #TRUE,-(sp) *クローズボックスあり
move.l #TRUE,-(sp) *手前に
move.w #_WDEF_NUM*16+WINOPT,-(sp)
move.w #TRUE,-(sp) *可視
pea.l WINTITLE(pc) *LASCII
pea.l winRect(a5) *ウィンドウレクタングル
.if WINTYPE='H'
Xpea winPtr(a5) *ワーク上に作成
.else
.if WINTYPE='P'
pea.l 0.w *ヒープ上に作成
.endif
.endif
SX __WMOpen,26
tst.l d0 *エラー?
bmi Win_init_ERR *ならば_INIT_Errへ
move.w #-1,winActive(a5) *アクティブフラグをセット
.if WINTYPE='P'
move.l a0,winPtr(a5) *winPtrをヒープに確保させた時
.endif
jbsr InitGraph *このウィンドウのグラフポートの初期設定
~T
rts
Win_init_ERR:
~F
rts
.endif
WINTITLE:
MAINWIN_NAME
.even
.endif
.text
*==============================================*
* INIT共通
*==============================================*
*VERSION_CHECK
* ~VERSION が定義されていること
*----------------------------------------------*
.ifdef ~VERSION
CHKVER:
SX __SXVer,0 *システムのバージョンを取得
cmp.w #~VERSION,d0 *(~VERSION)どのバージョン以降で動くか
bcs VER_ERR *バージョンエラー
~T
rts
VER_ERR:
lea.l ver_e_mes(PC),a0 *「バージョンが違う」
jbsr PrintMyErr
rts
.endif
*==============================================*
*A5相対で参照するワークを初期化する
*----------------------------------------------*
InitWork:
move.l #clr_end-clr_top,d0 *何バイトか
lea.l clr_top(a5),a0 *どのアドレスからか
moveq.l #0,d1 *0で埋める
jbsr FillMem
rts
*==============================================*
*タスクIDと、パス、タスク名、ファイル
*名を取り出す
ofs = -512
.offset ofs
task_WK ds.b 512
.text
*----------------------------------------------*
InitInfo:
SX __TSGetID,0
move.l d0,taskID(a5) *タスクIDを得る
link a6,#ofs
* moveq.l #-1,d0
* move.w d0,-(sp) *自分のID
movqw -1
pea task_WK(a6)
SX __TSGetTdb,6
*----------------------------------------------*
*PATH
lea my_path(a5),a3
pea (a3) *パス名格納先
pea task_WK(a6) *ファイル名へのポインタ
SX _NAMECK,8 *DOSCALL
*----------------------------------------------*
*NAME
lea my_name(a5),a2
move.l a2,a0 *名前を入れる先
lea 67(a3),a1 *ファイル名へのアドレス
jbsr CopyStrZ
*----------------------------------------------*
*MY_LEN
move.l a0,d0
sub.l a2,d0
move.b d0,my_len(a5) *NAMEの長さ
*----------------------------------------------*
*MY FILENAME
lea my_file(a5),a0 *ファイル名の入先
lea 67(a3),a1 *(ファイル名へのアドレス)
jbsr CopyStrZ
lea 86(a3),a1 *(拡張子へのアドレス)
jbsr CopyStrZ
*----------------------------------------------*
*STARTUP CHECK *スタートアップから起動されたかどうか?
lea.l task_WK(a6),a0
ifeq <btst.b #0,$1D5(a0)>
move.w #0,StupChk(a5)
else
move.w #-1,StupChk(a5) *-1ならスタートアップから
endif
unlk a6
rts
*==============================================*
* 下請けルーチン
*==============================================*
*メモリを指定されたデータで埋める
*93.10.01 rewrite
*IN d0.l = length (1..)
* d1.b = data
* a0.l = ptr
*OUT a0.l = nextPtr
* d0.l = RESAULT CODE(0,MINUS)
*----------------------------------------------*
FillMem::
move.l d2,-(sp)
move.l d1,-(sp)
tst.l d0
ble FillMem_err *length == 0
move.l a0,d2
lsr.w #1,d2 *2で割って
bcc FillMem_1 *アドレスが奇数なら分岐しない
move.b d1,(a0)+ *先頭を1バイト埋める
subq.l #1,d0 *ながさの帳尻合わせる
ble FillMem_9 *1バイトならおしまい
FillMem_1:
jbsr Fillsub
FillMem_9:
~T
FillMem_err:
move.l (sp)+,d1
move.l (sp)+,d2
rts
*==============================================*
*ポインタの内容を指定されたデータで埋める
*スタックに、データ(.w)と再配置不能ブロックのア
*ドレスをいれる。データは、下位バイトのみを認識する
*上位バイトは不定で構わない
.offset 0
ds.l 2
fp_ptr: ds.l 1
ds.b 1
fp_data: ds.b 1
.text
*----------------------------------------------*
FillPtr::
link a6,#0
move.l d1,-(sp)
move.l d2,-(sp)
move.l fp_ptr(a6),-(sp)
SX __MMPtrSizeGet,4 *ブロックの論理サイズを得る
move.l d0,d2
blt FillPtr_err
beq FillPtr_9
move.l fp_ptr(a6),a0
move.b fp_data(a6),d1
jbsr Fillsub
FillPtr_9:
~T
FillPtr_err:
move.l (SP)+,d2
move.l (SP)+,d1
unlk A6
rts
*==============================================*
*ハンドルの内容を指定されたデータで埋める
*スタックに、データ(.w)と再配置可能ブロックのハ
*ンドルをいれる。データは、下位バイトのみを認識
*するので上位バイトは不定で構わない
.offset 0
ds.l 2
fh_hdl: ds.l 1
ds.b 1
fh_data: ds.b 1
.text
*----------------------------------------------*
FillHdl::
link a6,#0
move.l d1,-(sp)
move.l d2,-(sp)
move.l fh_hdl(a6),-(sp)
SX __MMHdlSizeGet,4 *ブロックの論理サイズを得る
move.l d0,d2
blt FillHdl_err
beq FillHdl_9 *空のハンドルということもある
HDL2PTR fh_hdl(a6),a0 *ハンドルから現在のアドレスを得る
move.b fh_data(a6),d1
jbsr Fillsub
FillHdl_9:
~T
FillHdl_err:
move.l (SP)+,d2
move.l (SP)+,d1
unlk A6
rts
*----------------------------------------------*
*FILL系共通ルーチン
Fillsub:
move.b d1,d2
lsl.w #8,d1
move.b d2,d1
move.w d1,d2
swap d1
move.w d2,d1 *4Byteのデータをd1に展開
*(d1.b以外はなにが入っていても構わない)
move.l d0,d2 *length
lsr.l #4,d0 *16で割って
ble Fillsub_1 *d0<16のとき
Fillsub_lp:
move.l d1,(a0)+
move.l d1,(a0)+
move.l d1,(a0)+
move.l d1,(a0)+
subq.l #1,d0
bne Fillsub_lp
Fillsub_1:
andi.l #%1111,d2
beq Fillsub_3
subq.l #1,d2
Fillsub_2:
move.b d1,(a0)+
dbra d2,Fillsub_2
Fillsub_3:
rts
*==============================================*
*タスク名付きエラーダイアログ
*TSErrDialogNでいいんだけどね…
*IN a0.l = メッセージへのポインタ
*OUT d0.l = -1
OFS = -128
.offset OFS
PME_BUF ds.b 128
.text
*----------------------------------------------*
PrintMyErr::
link a6,#OFS
movem.l a1-a2,-(sp)
move.l a0,a2
lea.l PME_BUF(a6),a0
move.l a2,a1
jbsr CopyStrZ
lea.l my_file(a5),a1
jbsr CopyStrZ
pea.l PME_BUF(a6)
move.w #YELLOW_F,-(sp)
SX __DMError,6
~F
movem.l (sp)+,a1-a2
unlk a6
rts
*==============================================*
*エラーダイアログの表示。
*in a0.l = メッセージへのポインタ
*out d0.l = -1
*----------------------------------------------*
PrintErr::
pea (a0)
move.w #YELLOW_F,-(sp) *黄旗
SX __DMError,6
~F
rts
*==============================================*
*ASCIIZ 文字列をコピーする。
*IN a0.L = destPtr
* a1.L = srcPtr
*OUT a0.L = destPtr(文字列の最後を指す $0の位置)
* a1.L = srcPtr(文字列の最後+1を指す)
*----------------------------------------------*
CopyStrZ::
move.b (a1)+,(a0)+
bne CopyStrZ *$0 でないなら
subq.l #1,a0
rts
*==============================================*
*93.10.30 version
*LASCII 文字列をコピーする。
*IN a0.L = destPtr
* a1.L = srcPtr
*OUT a0.L = destPtr(文字列の最後+1を指す)
* a1.L = srcPtr (文字列の最後+1を指す)
*----------------------------------------------*
CopyStrL::
moveq.l #0,d0
move.b (a1),d0 *カウンタ(これでいいのだ~)
@@:
move.b (a1)+,(a0)+
dbra d0,@b
rts
*==============================================*
*イベントを取り除く。
*カレントグラフポートをセット。
*----------------------------------------------*
GetEvent::
pea eventRec(a5)
move.w #EM_EVERY,-(sp)
SX __TSGetEvent,6
rts
*==============================================*
*イベントを取り除く。
*カレントグラフポートをセット。
*----------------------------------------------*
NextEvent::
pea eventRec(a5)
move.w #EM_MSTOKEY,-(sp)
SX __EMGet,6
rts
*==============================================*
*ワークD_Clickに結果を格納。
*ワークnow_mptにマウスのローカル座標を格納。
*MS_time,MS_locateを使用。
*SETPORTしてから使うこと
*----------------------------------------------*
ChkMouse_DClick::
move.l eventRec_when(a5),d1 *左ダウンの時間(d1)が
move.l d1,d0
sub.l MS_time(a5),d1 *今回の左ダウンは直前の左ダウンの何秒後か
move.l d0,MS_time(a5) *ダウン時間を更新する
tst.b D_Click(a5) *フラグチェック
bne ChkMouse_skip *ダブルクリック後なので、なにもしない
move.l eventRec_whom2(a5),d0
swap d0
sub.w MS_locate(a5),d0
addq.w #3,d0 *前後2ポイント分の余裕見て
blt ChkMouse_skip *座標のチェック
subq.w #6,d0
bgt ChkMouse_skip
swap d0
sub.w MS_locate+2(a5),d0
addq.w #3,d0
blt ChkMouse_skip
subq.w #6,d0
bgt ChkMouse_skip
SX __EMDClickGet,0 *ダブルクリック基準時間を読み出すコール
cmp.l d0,d1
sle.b D_Click(a5) *ダブルクリックフラグ
bra ChkMouse_q
ChkMouse_skip:
sf.b D_Click(a5) *フラグ下ろす
ChkMouse_q:
move.l eventRec_whom2(a5),d0
move.l d0,MS_locate(a5) *今回の位置を記録
move.l d0,-(sp)
SX __GMGlobalToLocal,4
move.l d0,now_mpt(a5) *ローカル座標(ちゃんと返ります)
rts
*==============================================*
*ワークnow_mptにマウスのローカル座標を格納。
*----------------------------------------------*
ChkMousePtr::
move.l eventRec_whom2(a5),-(sp)
SX __GMGlobalToLocal,4
move.l d0,now_mpt(a5) *ローカル座標
rts
*==============================================*
*へこみレクタングルを書いたり、消したりする関数
* PEN MODE
* PENSIZE
* RECT
*の順にスタックに積む
*ペン位置は変更される
.offset -18
SBL: ds.w 1 *LEFT
SBT: ds.w 1 *TOP
SBR: ds.w 1 *RIGHT
SBB: ds.w 1 *BOTTOM
SBFC: ds.w 1 *FORE COLOR
SBBC: ds.w 1 *BACK COLOR
SBPM ds.w 1 *PEN MODE
SBPS ds.l 1 *PEN SIZE
ds.l 2
SBptr: ds.l 1 *レクタングルのアドレス
SBPSize: ds.l 1 *ペンサイズ
SBPmode: ds.w 1 *モード
.text
*==============================================*
__ShadowBox::
link a6,#-18
move.l d1,-(sp)
move.l SBptr(a6),a0
move.l (a0),SBL(a6)
move.l 4(a0),SBR(a6) *LTRBをいれる
moveq.l #G_BLACK,d0
move.w d0,-(sp)
SX __GMForeColor,2 *ForeColorを黒
move.w d0,SBFC(a6) *ForeColor退避
move.w SBPmode(a6),d0
tst.w d0
bne @f
moveq.l #0,d0 *ForeColorでPSET
@@:
move.w d0,-(sp)
SX __GMPenMode,2
move.w d0,SBPM(a6)
move.l SBPSize(a6),d0
tst.l d0
bne @f
move.l #1*$10000+1,-(sp) *1,1
bra ~SB1
@@:
move.l d0,-(sp)
~SB1:
SX __GMPenSize,4
move.l d0,SBPS(a6) *PEN SIZEを退避
move.w SBL(a6),d1
swap d1
move.w SBB(a6),d1
move.l d1,-(sp)
SX __GMMove,4 *左下
move.w SBT(a6),d1
move.l d1,-(sp)
SX __GMLine,4 *左下から左上
swap d1
move.w SBR(a6),d1
swap d1
move.l d1,-(sp)
SX __GMLine,4 *左上から右上
moveq.l #G_WHITE,d0
move.w d0,-(sp)
SX __GMForeColor,2 *ForeColorを白
move.w SBB(a6),d1
move.l d1,-(sp)
SX __GMLine,4 *右上から右下
swap d1
move.w SBL(a6),d1
swap d1
move.l d1,-(sp)
SX __GMLine,4 *右下から左下
move.w SBFC(a6),-(sp)
SX __GMForeColor,2 *ForeColorを黒
move.w SBPM(a6),-(sp)
SX __GMPenMode,2
move.w d0,SBPM(a6)
move.l SBPS(a6),-(sp)
SX __GMPenSize,4
move.l d0,SBPS(a6) *PEN SIZEを退避
move.l (sp)+,d1
unlk a6
rts
*===============================================*
* ローカルリソース(自分のパスのみ検索)
* オープンルーチン
* マイナスはエラー
* 返り値 a0不定 d0=Resmapへのハンドル
* オープンするリソースファイルが1つの
* 場合しか使えません(いまんとこ)
*===============================================*
.iff USE_RES=0
.offset -92
mro_path: ds.b 92
.text
MYResOpen::
link a6,#-92
move.l a1,-(sp)
lea.l my_path(a5),a1
lea.l mro_path(a6),a0
jbsr CopyStrZ
move.l 8(a6),a1
jbsr CopyStrZ
pea.l mro_path(a6)
SX __TSResOpen,4
bmi MRO_err
movea.l a0,a1
SX __TSResLoad,0
move.l a1,-(sp)
SX __TSCurResSet,4
move.l a1,d0
move.l (sp)+,a1
unlk a6
rts
MRO_err:
lea.l MRO_err_mes(pc),a0
jbsr PrintMyErr
move.l (sp)+,a1
unlk a6
~F
rts
MRO_err_mes:
dc.b 'リソースがオープンできません。',CR
dc.b '実行ファイルと同じディレクトリに、',CR
dc.b 'LBファイルをインストールしてください。',CR,0
.endif
*===============================================*
* ローカルリソース(自分のパスのみ検索)
* クローズルーチン
*===============================================*
.iff USE_RES=0
.offset -92
mrc_path: ds.b 92
.text
.xdef MYResClose
MYResClose:
link a6,#-92
move.l a1,-(sp)
lea.l my_path(a5),a1
lea.l mrc_path(a6),a0
jbsr CopyStrZ
move.l 8(a6),a1
jbsr CopyStrZ
pea.l mro_path(a6)
SX __TSResClose,4
bmi MRC_err
move.l (sp)+,a1
unlk a6
rts
MRC_err:
lea.l MRO_err_mes(pc),a0
jbsr PrintMyErr
move.l (sp)+,a1
unlk a6
~F
rts
.endif
*===============================================*
* ローカルリソース(自分のパスのみ検索)
* セーブクローズルーチン
*===============================================*
.iff USE_RES=0
.offset -92
mrs_path: ds.b 92
.text
.xdef MYResSave
MYResSave:
link a6,#-92
move.l a1,-(sp)
lea.l my_path(a5),a1
lea.l mrs_path(a6),a0
jbsr CopyStrZ
move.l 8(a6),a1
jbsr CopyStrZ
pea.l mro_path(a6)
SX __TSResSave,4
bmi MRS_err
move.l (sp)+,a1
unlk a6
rts
MRS_err:
lea.l MRO_err_mes(pc),a0
jbsr PrintMyErr
move.l (sp)+,a1
unlk a6
~F
rts
.endif
*===============================================*
*メニューアイテム変更1
*アクティブチェンジ
*move.l メニューハンドル,-(sp)
*move.w アイテム番号,-(sp) 1~
*move.w 変更フラグ,-(sp) 0,1
*0ならインアクティブ、1ならアクティブ
*-----------------------------------------------*
.iff USE_MENU=0
.xdef MNActChg
ofs = 0
.offset ofs
ds.l 2
MC_hdl: ds.l 1
MC_num: ds.w 1
MC_flg: ds.w 1
.text
MNActChg:
link a6,#ofs
movem.l d1-d4/a1,-(sp)
moveq #0,d1
move.l d1,d2
move.w MC_num(a6),d1
move.w MC_num(a6),d4
move.w MC_flg(a6),d2
move.l MC_hdl(a6),a1
move.l (a1),a1 *Menuのadr
subq.w #1,d4
cmp.w 18(a1),d4 *メニューアイテム数が少ない時
bgt MCerr
ifeq <tst.w d2> *インアクティブ
move.l 10(a1),d3
bclr.l d1,d3
move.l d3,10(a1)
moveq #0,d0
bra MCend
elseifeq <cmpi.w #1,d2> *アクティブ
move.l 10(a1),d3
bset.l d1,d3
move.l d3,10(a1)
moveq #0,d0
bra MCend
endif
MCerr
moveq #-1,d0
MCend:
movem.l (sp)+,d1-d4/a1
unlk a6
rts
.endif
*===============================================*
*メニューアイテム変更2
*チェックマークチェンジ
*move.l メニューハンドル,-(sp)
*move.w アイテム番号,-(sp) 1~
*move.w 変更フラグ,-(sp) 0,1
*0ならマークなし、1ならマークセット
*-----------------------------------------------*
.iff USE_RES=0
.xdef MNChkMChg
ofs = 0
.offset ofs
ds.l 2
MCM_hdl: ds.l 1
MCM_num: ds.w 1
MCM_flg: ds.w 1
.text
MNChkMChg:
link a6,#ofs
movem.l d1-d7/a1-a4,-(sp)
moveq #0,d1
move.l d1,d2
move.l d1,d5
move.l d1,d6
move.w MCM_num(a6),d1
move.w MCM_num(a6),d4
move.w MCM_flg(a6),d2
move.l MCM_hdl(a6),a1
move.l (a1),a1 *Menuのadr
lea.l 20(a1),a2 *Mdataの先頭adr
subq.w #1,d4 *1減らす
cmp.w 18(a1),d4 *変な値取ってないかチェック
bgt MCMerr
@@:
cmp.b d4,d6 *d6.b=COUNTER
beq @f
addq.b #1,d6 *カウンタ増
move.b 2(a2),d5 *d5.b=LASCII文字数
ifeq <btst.l #0,d5>
addq.b #1,d5 *偶数バンダリ調整(LASCIIが偶数時1追加)
endif
addq.b #3,d5
adda.l d5,a2 *次のアイテムの先頭
moveq #0,d5
bra @b
@@:
ifeq <tst.w d2> *チェックマーク消す
sf 1(a2) *バイトでクリア
moveq #0,d0
bra MCMend
elseifeq <cmpi.w #1,d2> *アクティブ
st 1(a2) *バイトでセット
moveq #0,d0
bra MCMend
endif
MCMerr:
moveq #-1,d0
MCMend:
movem.l (sp)+,d1-d7/a1-a4
unlk a6
rts
.endif
*===============================================*
.offset 0
ds.l 2
TimerP: ds.l 1
TickBase: ds.l 1
.text
*===============================================*
Timerproc::
move.l d1,-(sp)
SX __EMSysTime,0
move.l d0,d1
movea.l TimerP(sp),a0
sub.l (a0),d0 *カウントダウンして、時間きたかをd0に返す
ifcs <cmp.l TickBase(sp),d0>
moveq #0,d0 *まだ時間きてない
bra TP9
else
move.l d1,(a0)
moveq #-1,d0 *きちゃった
bra TP9
endif
TP9:
move.l (sp)+,d1
rts
*===============================================*
* DATA_AREA
*-----------------------------------------------*
.data
.even
e_mes::
dc.b 'エラーが発生しました',CR,LF,0
.even
ver_e_mes:
dc.b 'このバージョンのSXシステムでは動作しません',CR,LF,0
.even
*===============================================*
.end DOSSTART
*
*このスケルトンは複数のウィンドウを出すことに一応
*対応している。
*注意として、メインのウィンドウは、
*サブ扱いのウィンドウ(サブウィンドウではない)
*が使うイベントをマスクしてはいけない
*また、通常は、サブのウィンドウには、上位ワードに
*0以外を入れてタスクIDを登録することになってい
*るが、これを行った場合、サブのウィンドウにはキー
*ダウンイベントが来なくなる
*